package com.dragon.connector.imServer.handler;

import cn.hutool.extra.spring.SpringUtil;
import com.dragon.connector.imServer.cocurrent.FutureTaskScheduler;
import com.dragon.connector.imServer.serverProcesser.NotifyMessageProcesser;
import com.dragon.connector.imServer.serverProcesser.ReceiveMessageProcesser;
import com.dragon.protoJo.bean.msg.ProtoMsg;
import io.netty.channel.ChannelHandlerContext;
import io.netty.channel.ChannelInboundHandlerAdapter;
import lombok.extern.slf4j.Slf4j;

@Slf4j
public class InformationNotification extends ChannelInboundHandlerAdapter {

    public void channelRead(ChannelHandlerContext ctx, Object msg) throws Exception {
        if (null == msg || !(msg instanceof ProtoMsg.Message))
        {
            super.channelRead(ctx, msg);
            return;
        }

        ProtoMsg.Message pkg = (ProtoMsg.Message) msg;

        //取得请求类型,如果不是通知消息，直接跳过
        ProtoMsg.HeadType headType = pkg.getType();


        if (!headType.equals(ProtoMsg.HeadType.MESSAGE_NOTIFICATION))
        {
            super.channelRead(ctx, msg);
            return;
        }

        //处理消息的内容
        ProtoMsg.MessageNotification notificationPkg = pkg.getNotification();

        NotifyMessageProcesser notifyMessageProcesser = SpringUtil.getBean(NotifyMessageProcesser.class);


        // 异步处理接收聊天消息
        FutureTaskScheduler.add(()->{
//            LocalSession session = LocalSession.getSession(ctx);
//            // 判断该用户是否已经登录了的，如果登录了，则直接发送消息，如果没登录，则不发送任何消息
//            if(session != null && session.isLogin()){
//
//                return;
//            }
            notifyMessageProcesser.actionTcp(ctx,pkg);
            // 没有登录，则不发送消息
            //没有登录，则为中转消息,netty集群
//            ProtoMsg.MessageRequest request = message.getMessageRequest();
//            List<ServerSession> toSessions = SessionManger.inst().getSessionsBy(request.getTo());
//            toSessions.forEach((serverSession) ->
//            {
//                if (serverSession instanceof LocalSession)
//                // 将IM消息发送到接收方
//                {
//                    serverSession.writeAndFlush(message);
//                }
//            });
        });


//        //下线的通知
//        if (notification.getType() == Notification.SESSION_OFF)
//        {
//            String sid = notification.getWrapperContent();
//            log.info("收到用户下线通知, sid={}", sid);
////            SessionManger.inst().removeRemoteSession(sid);
//        }
//
//        //上线的通知
//        if (notification.getType() == Notification.SESSION_ON)
//        {
//            String sid = notification.getWrapperContent();
//            log.info("收到用户上线通知, sid={}", sid);
//            //待开发
////            SessionManger.inst().addRemoteSession(remoteSession);
//        }
//
//        //消息确认通知
//        if (notification.getType() == Notification.MESSAGE_ACK){
//            String sid = notification.getWrapperContent();
//            log.info("收到用户ack确认通知，sid={}", sid);
//            // 通知接收端，数据已经接收到了
//        }

        //netty 节点
//        if (notification.getType() == Notification.CONNECT_FINISHED)
//        {
//
//            Notification<ImNode> nodInfo =
//                    JsonUtil.jsonToPojo(json, new TypeToken<Notification<ImNode>>()
//                    {
//                    }.getType());
//
//
//            log.info("收到分布式节点连接成功通知, node={}", json);
//
//            //ctx.pipeline().remove("loginRequest");
//            ctx.pipeline().remove("login");
//            ctx.channel().attr(ServerConstants.CHANNEL_NAME).set(JsonUtil.pojoToJson(nodInfo));
//        }
    }
}
